/**
******************************************************************************
* @file   		udp.c
* @author  		WIZnet Software Team 
* @version 		V1.0
* @date    		2015-02-14
* @brief   		UDP演示函数
******************************************************************************
**/
#include "W5500_Driver.h"
#include "socket.h"
//#include "utility.h"
//#include "udp.h"
//#include "Includes.h"
/*
********************************************************************************
** 描述: 当udp准备好后,处理udp接收的数据并直接返回给远端. 若要实现其它功能则需重写该方法.
********************************************************************************/
__weak void ProcessUdpRxTx(void)
{
	uint16_t len = 0;
	uint8_t buff[32]; /*定义一个2KB的缓存*/
	
	if (getSn_IR(SOCK_UDPS) & Sn_IR_RECV)
	{
		setSn_IR(SOCK_UDPS, Sn_IR_RECV); /*清接收中断*/
	}
	if ((len = getSn_RX_RSR(SOCK_UDPS)) > 0)            /*接收到数据*/
	{
		len = recvfrom(SOCK_UDPS, buff, len, remote_ip, &remote_port); /*W5500接收计算机发送来的数据*/
		buff[len] = 0x00; /*添加字符串结束符*/
		PRINT("%s\r\n", buff); /*打印接收缓存*/ 
		sendto(SOCK_UDPS, buff, len, remote_ip, remote_port); /*W5500把接收到的数据发送给Remote*/
	}
}
/*
********************************************************************************
** 描述: 执行UDP, 主程序要周期性调用, 该方法在接收到udp数据后直接返回给远端.
**      若要实现其它功能则需重写void ProcessUdpRxTx(void)方法.
********************************************************************************/
void do_udp(void)
{                                                              
	switch (getSn_SR(SOCK_UDPS))        /*获取socket的状态*/
	{
	case SOCK_CLOSED:       /*socket处于关闭状态*/
		socket(SOCK_UDPS, Sn_MR_UDP, local_port, 0); /*初始化socket*/
		//配置中断:使能Sn_IR_RECV,Sn_IR_SEND_OK,Sn_IR_TIMEOUT
		IINCHIP_WRITE(SIMR, (1 << SOCK_UDPS));
		IINCHIP_WRITE(Sn_IMR(SOCK_UDPS), Sn_IR_RECV);
		break;
		
	case SOCK_UDP:          /*socket初始化完成*/
		ProcessUdpRxTx();
		break;
	}

}

